#include <stdio.h>
#include <stdlib.h>

// 顺序栈的实现
#define MaxSize 50    //定义栈中元素的最大个数
typedef char ElemType; // typedef：类型重命名

typedef struct
{
    ElemType data[MaxSize]; //存放栈中元素
    int top;                //栈顶指针
} SeqStack;

// 初始化栈
void InitStack(SeqStack &s)
{
    s.top = -1; //初始化栈顶指针
                // s.top=0;		//初始化栈顶指针指向栈底第一个位置
}

// 判空
bool StackEmpty(SeqStack &s)
{
    //若定义s.top=0;则栈空的条件：s.top==0;
    if (s.top == -1) //栈空
        return true;
    else
        return false; //不空
}

// 进栈
bool PushStack(SeqStack &s, ElemType x)
{
    // 若定义s.top=0;则栈满的条件:top==MaxSize
    if (s.top == MaxSize - 1) //栈满，报错
        return false;

    // 若定义s.top=0; 则s.data[s.top++]=x;
    s.data[++s.top] = x; //	指针先加1，再入栈

    return true;
}

// 出栈
bool PopStack(SeqStack &s, ElemType &x)
{
    //若定义s.top=0;则栈空的条件：s.top==0;
    if (s.top == -1) //栈空，报错
        return false;

    // 若定义s.top=0;则x=s.data[--s.top];
    x = s.data[s.top--]; //先出栈，再指针减1

    return true;
}

// 读取栈顶元素
bool GetTop(SeqStack &s, ElemType &x)
{
    //若定义s.top=0;则栈空的条件：s.top==0;
    if (s.top == -1) //栈空，报错
        return false;
    x = s.data[s.top]; // x记录栈顶元素
    return true;
}

int main()
{
    SeqStack S;
    InitStack(S);
    PushStack(S, 'a');
    PushStack(S, 'b');
    PushStack(S, 'c');
    PushStack(S, 'd');
    char x;
    GetTop(S, x);
    printf("%c\n", x);
    system("pause");
    return 1;
}